package com.dituhui.tool.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 读写本地文件
 * @author liweigu
 *
 */
public class FileTool {
	/**
	 * 编码值为 "utf-8"
	 */
	private static String Encoding = "utf-8";

	/**
	 * 读本地文件
	 * @param inputFile 文件
	 * @return 文件内容，每行内容对应列表里一个字符串。
	 */
	public static ArrayList<String> readFile(File inputFile) {
		ArrayList<String> lines = new ArrayList<String>();

		try {
			InputStreamReader isr = new InputStreamReader(new FileInputStream(inputFile), Encoding);
			BufferedReader read = new BufferedReader(isr);
			String line = null;
			while ((line = read.readLine()) != null) {
				lines.add(line);
			}
			read.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		return lines;
	}

	/**
	 * 写本地文件
	 * @param output 本地文件路径
	 * @param lines 文件内容，每行内容对应列表里一个字符串。
	 */
	public static void writeFile(String output, ArrayList<String> lines) {
		boolean append = true;
		writeFile(output, lines, append);
	}

	/**
	 * 写本地文件
	 * @param output 本地文件路径
	 * @param lines 文件内容，每行内容对应列表里一个字符串。
	 * @param append 是否追加文件，如果为false则重写文件。
	 */
	public static void writeFile(String output, ArrayList<String> lines, boolean append) {
		try {
			BufferedWriter write = new BufferedWriter(new FileWriter(output, append));

			for (String line : lines) {
				write.write(line);
				char lineBreak = '\n';
				char[] chars = { lineBreak };
				write.write(chars);
			}

			write.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 列举一个目录下的所有文件
	 * 
	 * @param dir 被搜索的目录
	 * @param filePostfix 要求的文件后缀名，如.txt；null值表示不根据后缀名过滤。
	 * @param listSubDir 是否搜索子子目录。
	 * @return 目录下的所有文件
	 */
	public static List<File> listFiles(String dir, final String filePostfix, boolean listSubDir) {
		ArrayList<File> fileList = new ArrayList<File>();

		File dirFile = new File(dir);
		if (dirFile.isDirectory()) {
			File[] files;
			if (filePostfix == null) {
				files = dirFile.listFiles();
			} else {
				FileFilter filter = new FileFilter() {
					@Override
					public boolean accept(File file) {
						boolean accepted;
						if (file.isDirectory()) {
							accepted = true;
						} else {
							accepted = file.getName().endsWith(filePostfix);
						}
						return accepted;
					}
				};
				files = dirFile.listFiles(filter);
			}
			for (File file : files) {
				if (file.isDirectory()) {
					List<File> subFileList = listFiles(file.getAbsolutePath(), filePostfix, listSubDir);
					fileList.addAll(subFileList);
				} else {
					fileList.add(file);
				}
			}
		} else {
			System.out.println(dir + " is not dir.");
		}

		return fileList;
	}
}
